package main

import (
	"LEARNGO/rpc/utils"
	"errors"
	"fmt"
	"log"
	"net"
	"net/http"
	"net/rpc"
)

//表示服务对象类型，该服务可以对客户端提供rpc调用
type MathService struct {
}

//请求对象类型是 utils.Args，响应类型就是个内置整型，通过 Multiply 方法定义乘法操作，通过 Divide 方法定义除法操作
//这两个方法首字母都是大写的，意味着可以被远程客户端调用。
//可以被rpc远程调用的方法，必须这样写:
// func (t *T) MethodName(argType T1, replyType *T2) error

//乘法
func (m *MathService) Multiply(args *utils.Args, reply *int) error {
	*reply = args.A * args.B
	return nil
}

//除法
func (m *MathService) Divide(args *utils.Args, reply *int) error {
	if args.B == 0 {
		return errors.New("除数不能为0")
	}

	*reply = args.A / args.B
	return nil
}

//在 main 函数中注册 MathService 服务对象并启动该 RPC 服务：
func main() {
	math := new(MathService)
	rpc.Register(math) //将服务对象，注册到服务端,这样才能访问

	//以HTTP服务器作为 RPC 服务端
	rpc.HandleHTTP()
	listener, err := net.Listen("tcp", ":8080")
	if err != nil {
		log.Fatal("启动监听服务失败", err)
	}
	
	//启动HTTP服务，等待客户端发送请求
	err = http.Serve(listener, nil)
	if err != nil {
		log.Fatal("启动HTTP服务失败", err)
	} else {
		fmt.Println("服务已启动...")
	}
}
